Skip to content

利用云服务器搭建个人的Web站点

作为web开发相关的程序员,在时间和精力充裕的条件下,可以利用云主机搭建一个自己的博客或开源项目,同时也可作为自己的测试环境,在上面做一些试验性的研究,甚至可以作为自己上网的代理服务器。

总之,好处还是挺多的,也能熟悉整个运维的流程和Linux系统的操作命令,收获成功的体验。

本文,我们使用阿里云的云主机ECS(可伸缩弹性计算服务)为例,搭建一个Web站点。

云主机的配置选择

根据个人的喜好以及业务需求,选择相应的云主机配置。国内比较知名的云主机服务商:阿里、腾讯、华为、电信天翼等都可以的。尽量选择大品牌的云计算服务上,毕竟技术实力强悍,稳定性有保证。

我是选择的老牌的阿里云主机,本着能省则省的原则,选择了最便宜的一款ECS。

选择配置时需要注意的点

付费类型选啥?

  • 如果是使用频繁,每天都会用到,选择包月的套餐比较划算。
  • 如果只是学习,研究,搭建一下个人站点,平时用的少,就选择按量付费

地域选啥

  • 如果没有访问外网的需求,就是国内的客户,不需要访问谷歌、Facebook等的服务的话,选择大陆的云主机就可以的。
  • 如果想访问外部的技术网站,搭建上网代理的话,就选择香港的云主机

实例选啥

完全根据自己的需求了,资金充裕的话,就选择高配置的(CPU、内存、磁盘等),当然是参数越高,服务器的性能越好,使用也就越流畅了。

镜像选啥

镜像就是给云主机安装的操作系统及预置环境了。建议选择自己所熟悉的OS,比如平时的业务开发是centos,就选择CentOS的镜像,尽量选择最新的版本。

如果无所谓了,那就选择官方推荐的默认选型:Alibaba Cloud Linux,维护也很及时,Bug少,质量有保障的。

选择公网IP吗?

Alt text

这个就看个人的需求了,选择了固定的公网IP,上网速度有保证,同时每月要固定支出价格不菲的流量费。

也可不选公网IP,后期创建好实例后,绑定一个弹性公网IP,走按量付费的模式,也很方便灵活的。

弹性IP是云服务提供商(如AWS、阿里云等)提供的一种用于云主机的静态IP地址,可以在云主机启动/关闭时进行分配和释放。而公网IP是由Internet服务提供商(如电信、移动等)分配给用户的静态IP地址,弹性IP具有更高的灵活性和可管理性,适用于动态的云计算环境,而公网IP则适用于需要静态公网IP的传统IT环境。

登录凭证选啥

Alt text

  • 针对小白用户,不熟悉Linux系统的操作的话,建议选择 密码模式
  • 针对老程序员,熟系Linux 运维的话,使用官方推荐的 密钥对

两则差别在于登录认证的方式,对后面的操作没有太大影响的。

当选好适合自己的配置后,就可以下单了,这样进入云主机的控制台页面,就能看到自己购买的实例了。

Alt text

上面是我选购的两台实例,配置都不高的。其中弹性公网IP的实例就是香港的那台ECS,走的是按量付费的模式,自己使用了多少网络流量,就花费多少钱;固定公网IP的实例就是北京的那台云主机,走的是包月付费的模式。

首次登录设置

购买好云主机后,就可以登录进去了,首次登录利用官方的Web控制台提供的入口进行登录。

Alt text

登录过程,比较简单,应该不会遇到什么阻碍的。如果首次设置的秘钥登录,还想添加密码登录的方式也很简单。

开启本地SSH访问

首次登录到云主机后,进入到shell命令行环境,默认是root目录,下面什么文件也没有。

Alt text

  1. 我们输入ls -lah显示出隐藏的文件夹
  2. 进入到 .ssh目录下,cd .ssh
  3. 发现了 authorized_keys文件(里面存放SSH的公钥)
  4. 我们将自己本地目录下的公钥key(一般是id_rsa.pub文件)的内容,拷贝到 authorized_keys 文件里面
  5. 然后保存即可。

然后,我们本地测试一下,打开本地系统的命令行环境。输入ssh root@服务器的IP

Alt text

这样就顺利在本地命令行中,通过SSH的方式登录远程的阿里云服务器了。

关于上面说的如何打开,修改 authorized_keys文件?

需要用到Linux的 vi命令。

bash
vi authorized_keys # 打开 authorized_keys 文件,
enter i # 进入编辑模式
# 将本地的 id_rsa.pub文件 中的内容,拷贝到里面
enter esc # 退出编辑模式
enter :wq # 保存并关闭 authorized_keys 文件
vi authorized_keys # 打开 authorized_keys 文件,
enter i # 进入编辑模式
# 将本地的 id_rsa.pub文件 中的内容,拷贝到里面
enter esc # 退出编辑模式
enter :wq # 保存并关闭 authorized_keys 文件

以上步骤,就完成了对远程服务器上的authorized_keys文件的修改。

authorized_keys文件里面存放的是允许登录该云主机的所有SSH公钥,可以放置多条记录,这样就能允许多人多客户机访问了。

每次输入IP比较麻烦,我们可以设置一个云主机的别名。

  • 进入到本地的 /${user}/.ssh 目录下
  • 找到 config 文件,添加云主机的相关信息
yml
Host hk-ecs
  AddKeysToAgent yes
  UseKeychain yes
  HostName 8.0.0.24
  User root
  Port 22
  IdentityFile ~/.ssh/id_rsa
Host hk-ecs
  AddKeysToAgent yes
  UseKeychain yes
  HostName 8.0.0.24
  User root
  Port 22
  IdentityFile ~/.ssh/id_rsa
bash
ssh root@hk-esc # 快捷访问了
ssh root@hk-esc # 快捷访问了

这样就能通过 hk-esc 指向真实的IP地址来快捷访问了。

除此之外,也能在zsh的配置(vi ~/.zshrc)通过设置别名的方式。

yml
alias hk="ssh root@hk-ecs"
alias hk="ssh root@hk-ecs"

这样仅需要输入 hk 就能访问远在香港的云主机了。

bash
hk  # 相当于 ssh root@hk-ecs =>  ssh root@ip
hk  # 相当于 ssh root@hk-ecs =>  ssh root@ip

Alt text

开启密码登录

先用可以登录的方式,进入到远程主机的shell命令行中。

bash
cat /etc/ssh/sshd_config
cat /etc/ssh/sshd_config

如下图所示,PasswordAuthentication参数设置为no,表示禁止以密码方式登录,需要修改为yes

Alt text

重启 sshd 服务

bash
service sshd restart
service sshd restart

搭建Web服务

进入正题,想要搭建自己的个人站点,先要安装一个web服务器软件,常用的有Apache、nginx。这里我们选择更轻量、高效的Nginx作为 Web服务。

  1. 安装 Nginx,利用远程主机自带的 yum 命令非常方便。
  2. yum install nginx
  3. 设置Nginx,修改相应的配置

安装完成后,查看安装版本。

bash
nginx -v # 查看安装版本,输出下面的信息
# nginx version: nginx/1.20.1
nginx -v # 查看安装版本,输出下面的信息
# nginx version: nginx/1.20.1

输出版本信息,说明安装成功,找到Nginx的配置文件,按需修改。

bash
nginx -t # 查看 和 检查Nginx的配置是否正确,输出下面的信息
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
vi /etc/nginx/nginx.conf  # 设置相关的配置
nginx -t # 查看 和 检查Nginx的配置是否正确,输出下面的信息
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
vi /etc/nginx/nginx.conf  # 设置相关的配置

比如,要设置Nginx的资源发布目录。

yml
server {
	root         /root/web-site/; # 默认为: /usr/share/nginx/html
}
server {
	root         /root/web-site/; # 默认为: /usr/share/nginx/html
}

完成自己的设置后,保存 nginx.conf 文件,启动 Nginx 服务

bash
nginx # 启动默认配置文件下的Nginx服务,后面也可跟各种参数的
nginx -s reload # 重新加载配置文件,每次修改配置后,要执行该命令
nginx -s stop # 停止Nginx服务
nginx # 启动默认配置文件下的Nginx服务,后面也可跟各种参数的
nginx -s reload # 重新加载配置文件,每次修改配置后,要执行该命令
nginx -s stop # 停止Nginx服务

我们首先在 远程主机上访问一下。出现下面的界面,说明Nginx服务正常启动了。

bash
curl http://localhost # 会出现下图所示的界面
curl http://localhost # 会出现下图所示的界面

Alt text

然后,打开本地的浏览器,输入 远程服务器的IP地址

Alt text

看到上面的测试页面,说明我们的个人站点的Web服务已经调通了,支持远程访问了。

如果无法访问,出现下面的情况,说明是ECS的防火墙屏蔽了 80 端口

Alt text

登录 到云主机的Web控制台,添加安全组的规则,允许访问ECS的 80 端口服务

Alt text

如果出现下面的,403 错误❌,则有可能是服务端的权限问题,Nginx未能正确启动。

Alt text

这是,需要到服务器上查看Nginx的配置,一般是由于权限问题导致的。

查看系统的Nginx进程,发现 master 进程 和 worker 进程不是一个用户模式,master 是 root用户,worker 是 nginx 用户。

Alt text

比如,这里我们设置了在发布目录为:/root/web-static,由于是root目录下,我们最好把Nginx的进程改成 root 用户启动模式。修改如下的配置:

yml
user root;  #修改前是 nginx
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
user root;  #修改前是 nginx
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
bash
nginx -s reload
nginx -s reload

重新加载 Nginx的配置,再次查看 Nginx的实例进程,就会发现 master 进程 和 worker 都是由 root 用户控制的了。

Alt text

访问浏览器,进一步测试,也是没有问题的了。

同步本地文件

我们开发了一个web页面,如何上传到云主机,完成Web资源的更新呢?

如果每次手动上传太麻烦了,耗时耗力,还容易出错。其实有多种同步方式,比如搭建FTP服务,使用ftp的上传方式,或者借助 rz命令上传。

  • 搭建FTP服务有点儿大费周章,还要再开启一个文件服务,增加端口配置等一些列操作
  • 使用 rz命令手动上传文件,太慢了,当同时修改了多个文件时效率低,且不支持上传目录

我们这里使用一种比较快捷高效的方式,直接在项目的开发工具VS-code中安装一个插件SFTP,它能帮我们自动将本地的文件目录同步到远程服务器。(使用其它IDE的同学,可以找找有无类似的插件了)

Alt text

给插件,添加远程服务器的相关参数,在项目的根目录下会生成 .vscode/sftp.json文件

json
{
    "name": "ALI Cloud ECS HongKong Server",
    "host": "8.0.0.0", // 换成您真实的云主机IP
    "protocol": "sftp",
    "port": 22,
    "username": "root", // 远程主机的访问账户
    "remotePath": "/root/web-site", // 远程服务器上要同步的目录
    "uploadOnSave": false,
    "useTempFile": true,
    "openSsh": true,
    "privateKeyPath": "/Users/hoke/.ssh/id_rsa", // SSH 私钥的路径
    "syncOption": {
        "delete": true // 同步选项,本地文件删除后,远程服务上也一并删除
    },
    "ignore": [ // 忽略同步的文件
        ".vscode",
        ".git",
        ".DS_Store",
        ".mp4"
    ]
}
{
    "name": "ALI Cloud ECS HongKong Server",
    "host": "8.0.0.0", // 换成您真实的云主机IP
    "protocol": "sftp",
    "port": 22,
    "username": "root", // 远程主机的访问账户
    "remotePath": "/root/web-site", // 远程服务器上要同步的目录
    "uploadOnSave": false,
    "useTempFile": true,
    "openSsh": true,
    "privateKeyPath": "/Users/hoke/.ssh/id_rsa", // SSH 私钥的路径
    "syncOption": {
        "delete": true // 同步选项,本地文件删除后,远程服务上也一并删除
    },
    "ignore": [ // 忽略同步的文件
        ".vscode",
        ".git",
        ".DS_Store",
        ".mp4"
    ]
}

添加完上面的配置后,在项目工程的某个目录上右键菜单,会出现同步选项。

Alt text

这样就能高效实现远程Web资源的及时更新了。

动态服务

如果个人的站点涉及到了动态服务,比如用户评论,投票,留言等需要和Web后台打交道的部分,则需要搭建相应的动态服务了。 可以用Java、PHP、NodeJS等后端语言,同时安装MySQL或MongoDB这样的数据库软件。

bash
yum install nvm # 通过 nvm 管理nodejs的版本
nvm install node@18  # 安装nodejs
yum install mysql # 安装MySQL数据库
yum install nvm # 通过 nvm 管理nodejs的版本
nvm install node@18  # 安装nodejs
yum install mysql # 安装MySQL数据库

设置 Nginx 的代理转发,将带 /api 的请求都转到后端的服务上去,否则请求相应的资源文件。这里假设,您又在服务器上部署了一套后台的数据接口服务,发布在 8080端口上。

yml
location /api { ## 后台服务
  proxy_pass  http://127.0.0.1:8080;
}
location / { ## 静态资源
    root   /root/web-site/;
    index  index.html index.htm;
}
location /api { ## 后台服务
  proxy_pass  http://127.0.0.1:8080;
}
location / { ## 静态资源
    root   /root/web-site/;
    index  index.html index.htm;
}

也可将相应的原始请求头,一并转发过去,便于做后续的日志分析。

yml
location  /api/ { ## 后台服务
    proxy_pass   http://127.0.0.1:7001;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
}
location  /api/ { ## 后台服务
    proxy_pass   http://127.0.0.1:7001;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
}

配备域名

通过IP地址,自己使用也还好。如果想对外提供服务,比如是自己的博客,直接用IP地址,一是不容易被人记住,二是不容易被搜索引擎收录。有自己的域名的话,易于积累长期的品牌效应。

申请域名的话,也可以使用阿里云的,或者万网这样的域名提供商,选择一个合适的域名,购买即可。购买完成后,就能见到如下图所示的界面了(我这里购买了两个域名,所以有两条记录)。

Alt text

域名申请下来后,就要添加解析了,如果要将域名解析到国内(大陆的云主机)就得进行域名备案了,需要实名认证,进行各项资料的报备,然后是管理局的审核,流程比较长,周期漫长(全程大约20天),需要耐心等待的。

这里推荐将个人站点,解析到香港的云主机上,这样就省去了一系列的审核备案的流程了,节省时间。

Alt text

域名解析设置很简单,如上图所示,只要绑定自己的云主机公网IP(固定公网IP和弹性公网IP都行的)即可。

搭建上网代理服务

如果我们购买的是香港的云主机,可以借此再搭建一个上网代理的服务,这样就能通过代理访问国外的一些网站了,比如很多程序员都会用到的Google、GitHub、homebrew等。

Alt text

步骤也很简单,主要是安装一个代理服务软件 squid

bash
yum install squid
yum install squid
  1. 安装 squid 代理服务软件
  2. 修改配置:vim /etc/squid/squid.conf => 允许客户端访问
  3. 添加防火墙的规则,允许 squid 服务的 3128端口通过
  4. 重启 squid 服务:systemctl restart squid

这里我们说一下,squid的关键配置

yml
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
http_access allow all
# Squid normally listens to port 3128
http_port 3128
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
http_access allow all
# Squid normally listens to port 3128
http_port 3128

http_access allow 允许访问代理服务器的客户端有哪些,就是说哪些客户端能够使用服务,避免被非法入侵或蹭网。

http_port 3128 是需要我们在防火墙中,设置放行的端口,否则本地无法使用代理服务的。

经过上面的步骤,就成功设置好代理服务器了。同时本地的电脑上添加,代理服务器的地址和端口就行了。

Alt text

我本地用的是苹果电脑Mac系统,代理设置效果如上图。本地设置好后,我们验证一下效果。

Alt text

可以看到上网出口,已经变成了香港的IP地址了。

总结

使用远程的云主机,可以给我带来很多的便利,方便我们进行研究试验,相当于是多了一台不会关机的电脑。 平时,我们可以将自己的业余项目部署在上面跑,或者将总结的文章搭建成博客的形式,持续的输出能让自己成长的更快。

在使用远程ECS的时候,要注意安全,设置好防火墙策略,关闭不必要的上行端口。如果资金不充裕的情况,就选择一个低配的服务器,走按量付费的模式。

相关链接